﻿#include "dialog.h"
#include "ui_dialog.h"
#include <QDir>
#include <QFileDialog>


Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

//选择一个文件 文件名显示在文件区
//QFileDialog 有一系列静态函数  可以打开一个文件，多个文件，保存文件，目录选择对话框等。
void Dialog::on_pbn_openfile_clicked()
{
    QString qDir = QDir::homePath();
    QString aFile = QFileDialog::getOpenFileName(this,"打开一个文件",qDir,"所有文件(*.*)");
    ui->le_filename->setText(aFile);
}

//选择一个目录 文件名显示在目录区
void Dialog::on_pbn_opendir_clicked()
{
    QString qDir = QDir::homePath(); //借助qdir设置一个默认目录
    QString aDir=QFileDialog::getExistingDirectory(this,"选择一个目录",qDir,QFileDialog::ShowDirsOnly);
    ui->le_dirname->setText(aDir);
}

//清除日志显示区
void Dialog::on_pbn_clearDisplay_clicked()
{
    ui->le_dirname->clear();
    ui->le_filename->clear();
    ui->te_Displaylog->clear();
}

//当前可执行文件所在的目录路径
void Dialog::on_pbn_app_path_clicked()
{
    QString str = QCoreApplication::applicationFilePath();
    ui->te_Displaylog->append("当前可执行文件所在路径:"+str);
}

void Dialog::on_pbn_app_dir_clicked()
{
    QString str = QCoreApplication::applicationDirPath();
    ui->te_Displaylog->append("当前可执行文件所在目录:"+str);
}

void Dialog::on_pbn_app_name_clicked()
{
    QString str = QCoreApplication::applicationName();
    ui->te_Displaylog->append("当前可执行文件名称:"+str);
    //这里会触发applicationNameChanged 这个信号 配合使用
    QCoreApplication::setApplicationName("myapp_test");
    ui->te_Displaylog->append("修改后可执行文件名称:"+QCoreApplication::applicationName());
}

void Dialog::on_pbn_applib_dir_clicked()
{
    //可以通过对应接口设置和删除
    QStringList str_list = QCoreApplication::libraryPaths();
    QString display = "相关依赖lib路径有: \n  ";
    foreach(const QString &str , str_list)
    {
        display += str;
        display += "\n  ";
    }
    ui->te_Displaylog->append(display);
}

void Dialog::on_pbn_appversion_clicked()
{
    //需要先设置再获取  这里可以迭代开发用
    QCoreApplication::setApplicationVersion("1.0.0");
    QString ver = QCoreApplication::applicationVersion();
    ui->te_Displaylog->append("当前可执行文件版本:"+ver);
}

//这里也是设置后生效  设置所属组织或者域名
void Dialog::on_pbn_app_org_clicked()
{
    QCoreApplication::setOrganizationName("我公司！");
    QCoreApplication::setOrganizationDomain("wogongsi.com");
    ui->te_Displaylog->append("所属公司："+QCoreApplication::organizationName());
    ui->te_Displaylog->append("所属域名："+QCoreApplication::organizationDomain());
    //每个继承  QObject类都有 objectName属性
//    this->setObjectName("XXX");
    ui->te_Displaylog->append("object:"+this->objectName());
}

//除此之外，其他一些公用的函数 比如事件相关的。
void Dialog::on_pbn_app_exit_clicked()
{
    QCoreApplication::exit();
}


//这里文件的相关操作需要基于已经选择的文件
void Dialog::on_pbn_file_exist_clicked()
{
    QString file_name = ui->le_filename->text();
    if(QFile::exists(file_name))
    {
        ui->te_Displaylog->append("QFile静态校验文件存在:"+file_name);
    }else
    {
        ui->te_Displaylog->append("QFile静态校验文件不存在:"+file_name);
    }
}

void Dialog::on_pbn_pfile_exit_clicked()
{
    QString file_name = ui->le_filename->text();
    QFile file(file_name);
    if(file.exists())
    {
        ui->te_Displaylog->append("QFile成员校验文件存在:"+file_name);
    }else
    {
        ui->te_Displaylog->append("QFile成员校验文件不存在:"+file_name);
    }
}

void Dialog::on_pbn_file_copy_clicked()
{
    QString file_name = ui->le_filename->text();
    QFileInfo file_info(file_name); //借助QFileInfo 构造拷贝后文件名
    QString dst_file_name =file_info.path()+"/"+file_info.baseName()+"_copy."+file_info.suffix();

    display_to_ui(QFile::copy(file_name, dst_file_name), "QFile静态拷贝文件", dst_file_name);
}

void Dialog::on_pbn_pfile_copy_clicked()
{
    QString file_name = ui->le_filename->text();
    QFileInfo file_info(file_name); //借助QFileInfo 构造拷贝后文件名
    QString dst_file_name =file_info.path()+"/"+file_info.baseName()+"_copy."+file_info.suffix();

    QFile file(dst_file_name);
    display_to_ui(file.copy(dst_file_name), "QFile成员拷贝文件", dst_file_name);
}

void Dialog::on_pbn_file_del_clicked()
{
    QString file_name = ui->le_filename->text();
    if(QFile::exists(file_name))
    {
        display_to_ui(QFile::remove(file_name), "QFile静态删除文件", file_name);
    }else
    {
        display_to_ui(false, "文件不存在, QFile静态删除文件", file_name);
    }
}

void Dialog::on_pbn_pfile_del_clicked()
{
    QString file_name = ui->le_filename->text();
    QFile file(file_name);
    if(file.exists())
    {
        display_to_ui(file.remove(), "QFile成员删除文件", file_name);
    }else
    {
        display_to_ui(false, "文件不存在, QFile成员删除文件", file_name);
    }
}

void Dialog::on_pbn_file_rename_clicked()
{
    QString file_name = ui->le_filename->text();
    QFileInfo file_info(file_name); //借助QFileInfo 构造拷贝后文件名
    QString dst_file_name =file_info.path()+"/"+file_info.baseName()+"_rename."+file_info.suffix();

    display_to_ui(QFile::rename(file_name, dst_file_name), "QFile静态重命名文件", dst_file_name);
}

void Dialog::on_pbn_pfile_rename_clicked()
{
    QString file_name = ui->le_filename->text();
    QFileInfo file_info(file_name); //借助QFileInfo 构造拷贝后文件名
    QString dst_file_name =file_info.path()+"/"+file_info.baseName()+"_rename."+file_info.suffix();

    QFile file(file_name);
    display_to_ui(file.rename(dst_file_name), "QFile成员重命名文件", dst_file_name);
}

#include <QStandardPaths>
void Dialog::on_pbn_file_trash_clicked()
{
    QString file_name = ui->le_filename->text();
    display_to_ui(false, "当前qt版本过低，可以用QFile::moveToTrash(),", file_name);
}

void Dialog::on_pbn_pfile_trash_clicked()
{
    QString file_name = ui->le_filename->text();
    display_to_ui(false, "当前qt版本过低，可以用file.moveToTrash(),", file_name);
}

void Dialog::display_to_ui(bool flag, QString str, QString filename)
{
    if(flag)
    {
        ui->te_Displaylog->append(str+"成功，目标文件名:"+filename);
    }else
    {
        ui->te_Displaylog->append(str+"失败，目标文件名:"+filename);
    }
}

void Dialog::display_qfileinfo(QString data, QString str)
{
    ui->te_Displaylog->append("QFileinfo操作 "+data+" :"+str);
}

//这里简单这样实现, 可以封装类等让代码更规范
//文件的各种属性  所属组  操作时间  等都可以通过QFileInfo
static QFileInfo g_file_info;
void Dialog::on_pbn_finfo_get_clicked()
{
    //基于选择的文件创建一个QFileInfo对象
    QString filename = ui->le_filename->text();
    g_file_info.setFile(filename);
    if(g_file_info.exists())
    {
        ui->te_Displaylog->append("获取QFileInfo成功。");
    }else
    {
        ui->te_Displaylog->append("获取QFileInfo失败，请检查。");
    }
}

void Dialog::on_pbn_finfo_abspath_clicked()
{
    display_qfileinfo("获取绝对路径", g_file_info.absoluteFilePath());
}

void Dialog::on_pbn_finfo_path_clicked()
{
    display_qfileinfo("获取路径(可能相对路径)", g_file_info.filePath());
}

void Dialog::on_pbn_finfo_absdir_clicked()
{
    display_qfileinfo("获取绝对目录", g_file_info.absolutePath());
}

void Dialog::on_pbn_finfo_dir_clicked()
{
    //也可以转成qdir处理
    display_qfileinfo("获取目录(可能相对路径)", g_file_info.path());
}
void Dialog::on_pbn_finfo_filename_clicked()
{
    display_qfileinfo("获取文件名", g_file_info.fileName());
}

void Dialog::on_pbn_finfo_size_clicked()
{
    display_qfileinfo("获取文件大小", QString::number(g_file_info.size()));
}

void Dialog::on_pbn_finfo_allbasename_clicked()
{
    display_qfileinfo("获取完整基本文件名(无后缀)", g_file_info.completeBaseName());
}

void Dialog::on_pbn_finfo_basename_clicked()
{
    display_qfileinfo("获取基本文件名(无后缀)", g_file_info.baseName());
}

void Dialog::on_pbn_finfo_allsuffix_clicked()
{
    display_qfileinfo("获取文件完整后缀", g_file_info.completeSuffix());
}

void Dialog::on_pbn_finfo__siffix_clicked()
{
    display_qfileinfo("获取文件后缀", g_file_info.suffix());
}

void Dialog::on_pbn_finfo_isdir_clicked()
{
    display_qfileinfo("是否是个文件夹", g_file_info.isDir()?"true":"false");
}

void Dialog::on_pbn_finfo_isfile_clicked()
{
    display_qfileinfo("是否是个文件", g_file_info.isFile()?"true":"false");
}

void Dialog::on_pbn_finfo_isExec_clicked()
{
    display_qfileinfo("是否可执行", g_file_info.isExecutable()?"true":"false");
}

#include <QDateTime>
void Dialog::on_pbn_finfo_createtime_clicked()
{
    display_qfileinfo("文件创建时间", g_file_info.birthTime().toString("yyyy-MM-dd hh:mm:ss"));
}

void Dialog::on_pbn_finfo_modtime_clicked()
{
    display_qfileinfo("文件最后修改时间", g_file_info.lastModified().toString("yyyy-MM-dd hh:mm:ss"));
}

void Dialog::on_pbn_finfo_readtime_clicked()
{
    display_qfileinfo("文件最后读时间", g_file_info.lastRead().toString("yyyy-MM-dd hh:mm:ss"));
}


//qDir主要处理目录 也可以处理文件  一般获取目录，遍历目录，增删改目录时用
void Dialog::on_pbn_dir_rootpath_clicked()
{
    //同样可以用成员 先返回qDir对象再去处理
    ui->te_Displaylog->append("根目录为："+QDir::rootPath());
}

void Dialog::on_pbn_dir_temppath_clicked()
{
    ui->te_Displaylog->append("临时目录为："+QDir::tempPath());
}

void Dialog::on_pbn_dir_homepath_clicked()
{
    ui->te_Displaylog->append("根目录为："+QDir::homePath());
}

//QFile::Permissions
void Dialog::on_pbn_dir_drives_clicked()
{
    QFileInfoList list = QDir::drives();
    QString display = "驱动盘为:";
    foreach(const QFileInfo &info, list)
    {
        display += info.path() + " "; //info.permissions();  //是文件权限相关的处理  QFile::Permissions
    }
    ui->te_Displaylog->append(display);
}

void Dialog::on_pbn_dir_curpath_clicked()
{
    ui->te_Displaylog->append("当前工作目录："+QDir::currentPath());
}

void Dialog::on_pbn_dir_setpath_clicked()
{
    bool flag = QDir::setCurrent("C:/test/currpath"); //虚构的目录  设置不成功
    QString dir = ui->le_dirname->text();
    flag = QDir::setCurrent(dir);
    ui->te_Displaylog->append("重新设置工作目录："+ QString(flag ?"true":"false"));
    ui->te_Displaylog->append("重设后当前工作目录："+QDir::currentPath());
}

//
void Dialog::on_pbn_dir_adddir_clicked()
{
    QDir qdir(ui->le_dirname->text());
    QString dirname = "create_dirname";
    if(qdir.mkdir(dirname))
    {
        ui->te_Displaylog->append("创建目录成功："+ui->le_dirname->text()+"/"+dirname);
    }else
    {
        ui->te_Displaylog->append("创建目录失败："+ui->le_dirname->text()+"/"+dirname);
    }
}

//可以删除文件或者目录
void Dialog::on_pbn_dir_deldir_clicked()
{
    QString filename = ui->le_filename->text();
    QString dirname = ui->le_dirname->text();
    QDir adir;
    //这里测试时
    ui->te_Displaylog->append(filename +" 删除 "+ QString((adir.remove(filename))?"成功":"失败"));
    ui->te_Displaylog->append(dirname +" 删除 "+ QString((adir.rmdir(dirname)?"成功":"失败")));
    //adir.rmpath()递归删除目录和子目录
}

//修改dir识别路径
void Dialog::on_pbn_dir_changedir_clicked()
{
    QDir adir;
    adir.setPath(ui->le_filename->text());
    ui->te_Displaylog->append("当前dir路径:"+adir.path());
    adir.setPath(ui->le_dirname->text());
    ui->te_Displaylog->append("修改后dir路径:"+adir.path()+" 文件夹名称："+adir.dirName()+" 路径"+adir.dirName());
}

//递归删除文件夹
void Dialog::on_pbn_dir_deldg_clicked()
{
    QDir adir;
    adir.setPath(ui->le_dirname->text());
    //adir指定了路径  filePath指定文件名  把路径和文件名结合起来了
    // ui->te_Displaylog->append("文件路径:"+adir.filePath("123.txt")); //查找指定文件或者目录的路径

    ui->te_Displaylog->append("递归删除文件夹测试："+QString(adir.removeRecursively()?"true":"false"));
}

//用qdir对文件或者文件夹进行重命名测试
void Dialog::on_pbn_dir_rename_clicked()
{
    QString filename = ui->le_filename->text();
    QString dirname = ui->le_dirname->text();
    QString file_rename = QFileInfo(filename).path()+"/"+QFileInfo(filename).baseName() +"_rename"+"."+QFileInfo(filename).suffix(); //只是演示 应该借助QFileinfo 对文件名进行处理
    QString dir_rename = dirname + "_rename";
//    QDir(dirname).cdUp(); //跳到父目录
    QDir adir;
    ui->te_Displaylog->append(filename+"重命名文件 "+ QString((adir.rename(filename, file_rename))?"成功":"失败"));
    ui->te_Displaylog->append(dirname+"重命名目录 "+ QString((adir.rename(dirname, dir_rename))?"成功":"失败"));
}

//操作文件路径
void Dialog::on_pbn_dir_filepath_clicked()
{
    QDir adir;
    ui->te_Displaylog->append("qdir获取文件路径:"+adir.filePath(ui->le_filename->text())); //查找指定文件或者目录的路径
}

void Dialog::on_pbn_dir_absfilepath_clicked()
{
    QDir adir;
    ui->te_Displaylog->append("qdir获取文件路径:"+adir.absoluteFilePath(ui->le_filename->text())); //绝对路径
}

void Dialog::on_pbn_dir_canonicalpath_clicked()
{
    QDir adir(ui->le_filename->text());
    ui->te_Displaylog->append("qdir获取文件路径:"+adir.canonicalPath()); //规则路径
}

//主要研究目录对应的相关路径
void Dialog::on_pbn_dir_dirpath_clicked()
{
    QDir adir("E:/Users/DELL/Desktop/新建文件夹/../../");
    ui->te_Displaylog->append("路径:"+adir.path());
    adir.cdUp();
    ui->te_Displaylog->append("父路径:"+adir.path());
}

void Dialog::on_pbn_dir_absdirpath_clicked()
{
    QDir adir("E:/Users/DELL/Desktop/新建文件夹/../../");
    ui->te_Displaylog->append("相对根目录绝对路径:"+adir.absolutePath());
//    adir.absoluteFilePath("file"); //遍历目录下文件使用
    adir.cdUp();
    ui->te_Displaylog->append("父路径:"+adir.absolutePath());
}

//规则路径
void Dialog::on_pbn_dir_cannonicalpath_clicked()
{
    QDir adir("E:/Users/DELL/Desktop/新建文件夹/../新建文件夹/");
    ui->te_Displaylog->append("相对根目录绝对路径:"+adir.canonicalPath()); //如果链接目录解析实际目录？
    adir.cdUp();
    ui->te_Displaylog->append("父路径:"+adir.canonicalPath());
}

void Dialog::on_pbn_dir_dirname_clicked()
{
    QDir adir(ui->le_dirname->text());
    ui->te_Displaylog->append("目录名为:"+adir.dirName());
}

//遍历目录下的所有目录
void Dialog::on_pbn_dir_dirlist_clicked()
{
    QDir adir(ui->le_dirname->text());
    QStringList list = adir.entryList(QDir::Dirs); //可以过滤目录 文件 读权限  写权限 执行权限等
    QString display = "遍历所有的目录:";
    foreach(const QString &str, list)
    {
        display += str + "  ";
    }
    ui->te_Displaylog->append(display);
}

//遍历目录下的所有文件
void Dialog::on_pbn_dir_filelist_clicked()
{
    QDir adir(ui->le_dirname->text());
    //可以排序
    QStringList list = adir.entryList(QDir::Files, QDir::Time); //可以过滤目录 文件 读权限  写权限 执行权限等
    QString display = "遍历所有的文件:";
    foreach(const QString &str, list)
    {
        display += adir.absoluteFilePath(str) + "  ";
    }
    ui->te_Displaylog->append(display);
}

//创建临时目录或者临时文件
void Dialog::on_pbn_ls_dir_clicked()
{
    ui->te_Displaylog->append("当前系统临时目录为:"+QDir::tempPath());
}

#include <QTemporaryDir>
#include <QTemporaryFile>
#include <QThread>
//没有指定目录 就是在系统默认临时目录下创建
void Dialog::on_pbn_ls_tempdir_create_clicked()
{
    QTemporaryDir adir;
    adir.setAutoRemove(true);
    ui->te_Displaylog->append("创建临时目录:"+adir.path());

    QTemporaryFile afile;
    afile.setAutoRemove(true);
    afile.open();
    afile.write("123456", 7);
    QThread::sleep(5);
    ui->te_Displaylog->append("创建临时文件:"+afile.fileName()+"文件大小："+afile.size());
    afile.close();
}

//可以看到在对应目录下创建了临时目录或者文件  文件设置不自动删除  所以没删除
void Dialog::on_pbn_ls_onedir_create_clicked()
{
    QString temp_file = "temp_file.tmp";
    QString temp_dir = "temp_dir";

    QTemporaryDir adir(ui->le_dirname->text() +"/"+temp_dir);
    adir.setAutoRemove(true);
    ui->te_Displaylog->append("特定目录下创建临时目录:"+adir.path());

    QTemporaryFile afile(ui->le_dirname->text() +"/"+temp_file);
    afile.setAutoRemove(false);
    //    afile.autoRemove();
    afile.open();
    ui->te_Displaylog->append("特定目录下创建临时文件:"+afile.fileName());
    QThread::sleep(5);
    afile.close();
}

void Dialog::on_pbn_ls_curdir_create_clicked()
{
    QString temp_file = "temp_file.tmp";
    QString temp_dir = "temp_dir";

    QTemporaryDir adir(temp_dir);
    adir.setAutoRemove(true);
    ui->te_Displaylog->append("当前工作目录下创建临时目录:"+adir.path());

    QTemporaryFile afile(temp_file);
    afile.setAutoRemove(false);
    //    afile.autoRemove();
    afile.open();
    ui->te_Displaylog->append("当前工作目录下创建临时文件:"+afile.fileName());
    QThread::sleep(5);
    afile.close();
}

#include <QFileSystemWatcher>
//监视文件或者目录  可以监视多个  可以增加监视 删除监视

QFileSystemWatcher g_file_dir_watch;
bool g_flag = false;
void Dialog::on_pbn_watcher_addfile_clicked()
{
    if(!g_flag)
    {
        connect(&g_file_dir_watch,&QFileSystemWatcher::directoryChanged, this,&Dialog::do_directoryChanged); //directoryChanged
        connect(&g_file_dir_watch,&QFileSystemWatcher::fileChanged, this,&Dialog::do_fileChanged); //fileChanged
        g_flag = true;
    }
    g_file_dir_watch.addPath(ui->le_filename->text());
    ui->te_Displaylog->append("添加监视文件："+ui->le_filename->text());
}

void Dialog::on_pbn_watcher_adddir_clicked()
{
    g_file_dir_watch.addPath(ui->le_dirname->text());
    ui->te_Displaylog->append("添加监视目录："+ui->le_dirname->text());
}

void Dialog::on_pbn_watcher_gets_clicked()
{
    QStringList list = g_file_dir_watch.directories();
    QString display = "获取已经监视的目录：";
    foreach(const QString &str, list)
    {
        display += str;
    }
    ui->te_Displaylog->append(display);
}

void Dialog::on_pbn_watcher_getfiles_clicked()
{
    QStringList list = g_file_dir_watch.files();
    QString display = "获取已经监视的文件：";
    foreach(const QString &str, list)
    {
        display += str;
    }
    ui->te_Displaylog->append(display);
}

void Dialog::on_pbn_watcher_delfile_clicked()
{
    g_file_dir_watch.removePath(ui->le_filename->text());
    ui->te_Displaylog->append("移除监视文件："+ui->le_filename->text());
}

void Dialog::on_pbn_watcher_deldir_clicked()
{
    g_file_dir_watch.removePath(ui->le_dirname->text());
    ui->te_Displaylog->append("移除监视目录："+ui->le_dirname->text());
}

void Dialog::do_directoryChanged(const QString &path)
{
    ui->te_Displaylog->append(path +"目录发生变化，触发事件");
}

void Dialog::do_fileChanged(const QString &path)
{
    ui->te_Displaylog->append(path +"文件发生变化，触发事件");
}

void Dialog::on_pbn_watcher_delall_clicked()
{
//    g_file_dir_watch.disconnect();
    disconnect(&g_file_dir_watch);
}
